css: Implement transitions for numbers of different units
authorBenjamin Otte <otte@redhat.com>
Sat, 13 Feb 2016 03:47:51 +0000 (04:47 +0100)
committerBenjamin Otte <otte@redhat.com>
Sat, 13 Feb 2016 03:49:08 +0000 (04:49 +0100)
We now can transition from 10px to 100%.

Note that this requires a teensy tiny hack in
gtk_css_value_transition(), but so be it.

gtk/gtkcsscalcvalue.c
gtk/gtkcssdimensionvalue.c
gtk/gtkcssnumbervalue.c
gtk/gtkcssnumbervalueprivate.h
gtk/gtkcssvalue.c

index e10e790b23a91600c1264dd3f2d023c137387589..8a2741a89eafc8e652f1e320f74529705845020a 100644 (file)
@@ -150,15 +150,6 @@ gtk_css_value_calc_equal (const GtkCssValue *value1,
   return TRUE;
 }
 
-static GtkCssValue *
-gtk_css_value_calc_transition (GtkCssValue *start,
-                               GtkCssValue *end,
-                               guint        property_id,
-                               double       progress)
-{
-  return NULL;
-}
-
 static void
 gtk_css_value_calc_print (const GtkCssValue *value,
                           GString           *string)
@@ -257,7 +248,7 @@ static const GtkCssNumberValueClass GTK_CSS_VALUE_CALC = {
     gtk_css_value_calc_free,
     gtk_css_value_calc_compute,
     gtk_css_value_calc_equal,
-    gtk_css_value_calc_transition,
+    gtk_css_number_value_transition,
     gtk_css_value_calc_print
   },
   gtk_css_value_calc_get,
index 87efb7a6d6999f2c7e0af95b15632d8015652058..92c2d99cda8d56cbfe0b6418d58df2230e117a5b 100644 (file)
@@ -167,21 +167,6 @@ gtk_css_value_dimension_equal (const GtkCssValue *number1,
          number1->value == number2->value;
 }
 
-static GtkCssValue *
-gtk_css_value_dimension_transition (GtkCssValue *start,
-                                 GtkCssValue *end,
-                                 guint        property_id,
-                                 double       progress)
-{
-  /* FIXME: This needs to be supported at least for percentages,
-   * but for that we kinda need to support calc(5px + 50%) */
-  if (start->unit != end->unit)
-    return NULL;
-
-  return gtk_css_dimension_value_new (start->value + (end->value - start->value) * progress,
-                                      start->unit);
-}
-
 static void
 gtk_css_value_dimension_print (const GtkCssValue *number,
                             GString           *string)
@@ -290,7 +275,7 @@ static const GtkCssNumberValueClass GTK_CSS_VALUE_DIMENSION = {
     gtk_css_value_dimension_free,
     gtk_css_value_dimension_compute,
     gtk_css_value_dimension_equal,
-    gtk_css_value_dimension_transition,
+    gtk_css_number_value_transition,
     gtk_css_value_dimension_print
   },
   gtk_css_value_dimension_get,
index d685fda902b07aa8d084683e4e82fae2b3a9d5a4..80239d6f4d883a5469a4ece9c5448c6f756f83e0 100644 (file)
@@ -106,6 +106,25 @@ _gtk_css_number_value_new (double     value,
   return gtk_css_dimension_value_new (value, unit);
 }
 
+GtkCssValue *
+gtk_css_number_value_transition (GtkCssValue *start,
+                                 GtkCssValue *end,
+                                 guint        property_id,
+                                 double       progress)
+{
+  GtkCssValue *result, *mul_start, *mul_end;
+
+  mul_start = gtk_css_number_value_multiply (start, 1 - progress);
+  mul_end = gtk_css_number_value_multiply (end, progress);
+
+  result = gtk_css_number_value_add (mul_start, mul_end);
+
+  _gtk_css_value_unref (mul_start);
+  _gtk_css_value_unref (mul_end);
+
+  return result;
+}
+
 gboolean
 gtk_css_number_value_can_parse (GtkCssParser *parser)
 {
index 7cb750f87c1e448ed99cb4044e6b04d7f88c86aa..ddded6674ce060f54d2657afeb9eb0e0922158d1 100644 (file)
@@ -54,6 +54,10 @@ struct _GtkCssNumberValueClass {
 
 GtkCssValue *   _gtk_css_number_value_new           (double                  value,
                                                      GtkCssUnit              unit);
+GtkCssValue *   gtk_css_number_value_transition     (GtkCssValue            *start,
+                                                     GtkCssValue            *end,
+                                                     guint                   property_id,
+                                                     double                  progress);
 gboolean        gtk_css_number_value_can_parse      (GtkCssParser           *parser);
 GtkCssValue *   _gtk_css_number_value_parse         (GtkCssParser           *parser,
                                                      GtkCssNumberParseFlags  flags);
index 97804157b32228e8f8ee477ac502fc1c110ad8b4..b9755cf6c4bc7b9c5eadf6e4bb1c20bf018adf14 100644 (file)
@@ -136,7 +136,9 @@ _gtk_css_value_transition (GtkCssValue *start,
   gtk_internal_return_val_if_fail (start != NULL, FALSE);
   gtk_internal_return_val_if_fail (end != NULL, FALSE);
 
-  if (start->class != end->class)
+  /* We compare functions here instead of classes so that number
+   * values can all transition to each other */
+  if (start->class->transition != end->class->transition)
     return NULL;
 
   return start->class->transition (start, end, property_id, progress);